package com.dq.domain.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 数据库操作基类
 *
 * @author 葛文镇
 */
public interface BaseDao {
    public String query2Hql(Class c, Map<String, Object> query);
    public String count2Hql(Class c, Map<String, Object> query);

    public String queryAdminHql(Class c, Map<String,Object> query);
    public String countAdminHql(Class c, Map<String,Object> query);

    /**
     * 使用原生Sql
     */
    public List<Map> findBySql2Map(String sql, Map<String, Object> param);
    public List<Map> findBySql2Map(String sql, Map<String, Object> param, Integer page, Integer rows);
    public <T extends Object> List<T> findBySql(Class c, String sql);
    public <T extends Object> List<T> findBySql(Class c, String sql, Map<String, Object> param);
    public <T extends Object> List<T> findBySql(Class c, String sql, Map<String, Object> param, Integer page, Integer rows);
    public Long countBySql(String sql);
    public Long countBySql(String sql, Map<String, Object> param);


    /**
     * 查询
     *
     * @param hql
     * @return
     */
    public <T extends Object> List<T> find(String hql);

    /**
     * 查询集合
     *
     * @param hql
     * @param param
     * @return
     */
    public <T extends Object> List<T> find(String hql, Object[] param);

    /**
     * 查询集合
     *
     * @param hql
     * @param param
     * @return
     */
    public <T extends Object> List<T> find(String hql, Map<String, Object> param);

    /**
     * 查询集合(带分页)
     *
     * @param hql
     * @param param
     * @param page  查询第几页
     * @param rows  每页显示几条记录
     * @return
     */
    public <T extends Object> List<T> find(String hql, Object[] param, Integer page, Integer rows);

    /**
     * 查询集合(带分页)
     *
     * @param hql
     * @param param
     * @param page
     * @param rows
     * @return
     */
    public <T extends Object> List<T> find(String hql, Map<String, Object> param, Integer page, Integer rows);


    /**
     * 获得一个对象
     *
     * @param c  对象类型
     * @param id
     * @return Object
     */
    public <T extends Object> T get(Class<T> c, Serializable id);

    /**
     * 获得一个对象
     *
     * @param hql
     * @param param
     * @return Object
     */
    public <T extends Object> T get(String hql, Object[] param);

    /**
     * 获得一个对象
     *
     * @param hql
     * @param param
     * @return
     */
    public <T extends Object> T get(String hql, Map<String, Object> param);


    /**
     * select count(*) from 类
     *
     * @param hql
     * @return
     */

    /**
     * select count(*) from 类
     *
     * @param hql
     * @param param
     * @return
     */
    public Long count(String hql, Object[] param);

    /**
     * select count(*) from 类
     *
     * @param hql
     * @param param
     * @return
     */
    public Long count(String hql, Map<String, Object> param);


    /**
     * 执行HQL语句
     *
     * @param hql
     * @return 响应数目
     */
    public Integer executeHql(String hql);

    /**
     * 执行HQL语句
     *
     * @param hql
     * @param param
     * @return 响应数目
     */
    public Integer executeHql(String hql, Object[] param);

    /**
     * 执行HQL语句
     *
     * @param hql
     * @param param
     * @return
     */
    public Integer executeHql(String hql, Map<String, Object> param);

    /**
     * 逻辑删除一个对象
     *
     * @param o
     */
    public <T extends BaseEntity> void delete(T o);

    /**
     * 逻辑删除一个对象
     *
     * @param o
     */
    public <T extends BaseEntity> void forceDelete(T o);


    /**
     * 保存一个对象
     * @param o
     * @return
     */
    public <T extends BaseEntity> void save(T o);
    /**
     * 更新一个对象
     * @param o
     */
    public <T extends BaseEntity> void modify(T o);

    /**
     * 保存或更新对象
     *
     * @param o
     */
    public <T extends BaseEntity> void saveOrModify(T o);

    /**
     * 批量更新/添加
     * @param list
     * @param <T>
     */
    public <T extends BaseEntity> void saveOrModifyList(List<T> list);
}
